/*
有一段长为 n（n 为正整数）的绳子：

* 中间剪一刀，就会变成 2 段绳子；
* 先对折一次，再中间剪一刀，就会变成 3 段绳子；
* 先对折两次，再中间剪一刀，就会变成 5 段绳子；
* 先对折三次，再中间剪一刀，就会变成 9 段绳子；
* ...

编写一个程序，计算对折数为 m 的时候，中间剪一刀，可以得到多少段绳子。

分别用普通方法和递归的方法求解这个问题。

递归算法有两个要素：
1. 初始条件 - 不需要计算就能得到的结果 - 对折 0 次剪一刀: 2 段 或者 对折 1 次剪一刀：3 段
2. 递归公式 - 如果根据前面的情况推算出当前的情况 - 折 n 次的绳子的数量 = 折 n-1 次绳子的数量 * 2 - 1
*/

int solution(int n) {
  if (n <= 0) {
    // 不对折直接剪
    return 2;
  }

  // 至少对折一次
  return solution(n - 1) * 2 - 1;
}